// 导入 http 模块
import http from 'wechat-http'

// 配置基地址
http.baseURL = 'https://live-api.itheima.net'
// 请求拦截器
http.intercept.request = (config) => {
  // 统一为每一个接口添加Authorization 请求头,值是token
  const token = getApp().token
  // 当请求的时候 不是token刷新页面 才携带Authorization = token
  if (token && !config.url.includes('/refreshToken')) {
    // 如果请求信息中 有header,就使用header本身,如果没有header,给它赋值为一个空对象
    config.header = config.header || {}
    // 将请求头中的注入 全局定义的token
    config.header.Authorization = token
  }
  return config
}


// 响应拦截器 返回的数据中有一些冗余的数据，通过响应拦截器进行优化
http.intercept.response = async (res) => {
  // console.log(res);

  // 判断接口返回的状态码 返回结果为401  代表token失效
  if (res.statusCode === 401) {
    // 如果刷新token的接口返回也是401 ，代表refreshToekn 也会失效
    if (res.config.url.includes('/refreshToken')) {
      // 获取路由栈
      const pageStack = getCurrentPages()
      // 获取当前页面路由信息
      const currentPage = pageStack[pageStack.length - 1]
      // console.log(pageStack);
      // 跳转到登录页
      wx.redirectTo({
        url: `/pages/login/index?returnUrl=/${currentPage.route}`
      })
      // 把响应拦截器的结果 返回出去
      return res.data
    }
    // token失效要 调用刷新token接口 ,并以请求头的方式将 refreshToken 传递给后端
    const { code, data } = await wx.http({
      url: '/refreshToken',
      method: 'POST',
      header: {
        Authorization: getApp().refreshToken
      }
    })
    // 此时需要解决请求拦截器中的请求头
    if (code !== 10000) return wx.utils.toast()
    // 接收新的 token 和refreshToken 重新赋值+
    getApp().setToken(data.token, data.refreshToken)

    // 当拿到了新的token之后 重新调取401 的请求接口,拿到正确的数据
    // 问题1:如何获取到401报错的接口?  在响应拦截器的 res中有config对象里可以获取到请求接口的详细情况
    const result = await wx.http({
      ...res.config
    })
    return result
  }
  // 解套
  // 剥离无用的数据
  return res.data
}
// 挂载方法到全局
wx.http = http